package com.xuecheng.auth.service.config;//package com.xuecheng.auth.service.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.jwt.Jwt;
import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
import org.springframework.security.oauth2.provider.token.TokenEnhancerChain;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.InMemoryTokenStore;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;

import java.util.Arrays;

/**
 * 配置类，用于 OAuth2 认证和 JWT 配置。
 * 主要配置了 Token Store、Jwt 令牌转换器以及令牌服务等。
 */
@Configuration
public class TokenConfig {

    private String SIGNING_KEY = "mq123";  // JWT 的签名密钥，签发的 JWT 令牌将用这个密钥进行签名

    @Autowired
    TokenStore tokenStore;  // TokenStore 用于存储和管理令牌

    @Autowired
    private JwtAccessTokenConverter accessTokenConverter;  // 用于将令牌转换为 JWT 格式

    /**
     * 创建并配置一个 TokenStore，使用 JWT 存储方式。
     *
     * TokenStore 用于管理 OAuth2 令牌（访问令牌和刷新令牌等）。此处使用 JwtTokenStore，
     * 令牌将以 JWT 格式进行存储。
     */
    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(accessTokenConverter());  // 传入 JwtAccessTokenConverter 实例
    }

    /**
     * 创建并配置 JwtAccessTokenConverter，用于将 OAuth2 令牌转换成 JWT 格式。
     * 设置签名密钥，确保生成的 JWT 可以进行签名验证。
     */
    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey(SIGNING_KEY);  // 设置签名密钥，用于签名和验证 JWT
        return converter;
    }

    /**
     * 配置授权服务器的 Token 服务，管理生成和存储 OAuth2 令牌。
     *
     * - 支持刷新令牌（refresh token）
     * - 设置令牌的有效期（access token 和 refresh token）
     */
    @Bean(name="authorizationServerTokenServicesCustom")
    public AuthorizationServerTokenServices tokenServices() {
        DefaultTokenServices service = new DefaultTokenServices();

        // 设置是否支持刷新令牌
        service.setSupportRefreshToken(true);

        // 设置令牌存储方式（此处为使用 JwtTokenStore 存储令牌）
        service.setTokenStore(tokenStore);

        // 设置访问令牌的有效期为 2 小时（7200 秒）
        service.setAccessTokenValiditySeconds(7200);  // 默认 2 小时过期

        // 设置刷新令牌的有效期为 3 天（259200 秒）
        service.setRefreshTokenValiditySeconds(259200);  // 默认 3 天过期

        // 设置令牌增强器链（通过 TokenEnhancerChain 可以对令牌进行自定义增强）
        TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
        tokenEnhancerChain.setTokenEnhancers(Arrays.asList(accessTokenConverter));  // 增强器中加入 JWT 转换器

        // 设置令牌增强器
        service.setTokenEnhancer(tokenEnhancerChain);


        return service;
    }

}








//@Configuration
//public class TokenConfig {
//
//    @Autowired
//    TokenStore tokenStore;
//
//    @Bean
//    public TokenStore tokenStore() {
//        //使用内存存储令牌（普通令牌）
//        return new InMemoryTokenStore();
//    }
//
//    //令牌管理服务
//    @Bean(name="authorizationServerTokenServicesCustom")
//    public AuthorizationServerTokenServices tokenService() {
//        DefaultTokenServices service=new DefaultTokenServices();
//        service.setSupportRefreshToken(true);//支持刷新令牌
//        service.setTokenStore(tokenStore);//令牌存储策略
//        service.setAccessTokenValiditySeconds(7200); // 令牌默认有效期2小时
//        service.setRefreshTokenValiditySeconds(259200); // 刷新令牌默认有效期3天
//        return service;
//    }
//
//
//}





